using System.Reflection;

namespace Utils.MonoInject
{
    /// <summary>
    /// Mono初始化器接口 - 用于在组件自动注入完成后执行自定义初始化逻辑
    ///
    /// 用法：
    /// 1. 在需要执行自定义初始化逻辑的 MonoBehaviour 类中实现此接口
    /// 2. 在 Initialize() 方法中编写初始化代码
    /// 3. 当调用 this.AutoInject() 时，会自动执行 Initialize() 方法
    ///
    /// 示例：
    /// public class PlayerController : MonoBehaviour, IMonoInitializer
    /// {
    ///     [AutoInject] private Rigidbody rb;
    ///     [AutoInject("MainCamera")] private Camera mainCamera;
    ///
    ///     public void Initialize()
    ///     {
    ///         // 所有依赖组件已自动注入完成，可以安全地使用它们
    ///         rb.mass = 10f;
    ///         mainCamera.fieldOfView = 60f;
    ///         Debug.Log("PlayerController 初始化完成");
    ///     }
    /// }
    ///
    /// 注意事项：
    /// - Initialize() 方法会在所有标记了 [AutoInject] 和 [AutoInjectCollection] 的字段自动注入完成后自动调用
    /// - 适合用于组件间的依赖关系建立、初始化配置、事件注册等操作
    /// - 避免在 Initialize() 方法中执行耗时操作，建议只做必要的初始化
    /// - 如果初始化失败，建议抛出异常或记录错误日志
    /// - 此接口与 Unity 的生命周期方法（Awake、Start）配合使用效果最佳
    /// - 建议在 Awake() 中调用 this.AutoInject()，然后在 Initialize() 中执行初始化
    /// - 如果不需要自定义初始化逻辑，可以不实现此接口
    /// </summary>
    public interface IMonoInitializer
    {
        /// <summary>
        /// 组件自动注入完成后的初始化方法
        /// 当所有标记了自动注入属性的字段都被赋值后自动调用
        /// </summary>
        void OnInitialize();
    }
}